package com.coscon.utils;


import org.apache.commons.lang3.StringUtils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**
 * 处理验证的工具包
 * @author Administrator
 */
public class ValidateUtil {


	/*        *
	 *密码强度规则1：8-30个字符，至少1个字母，1个数字和1个特殊字符
	 * @author 409390047@qq.com
	 * @date 2019/7/26
	 * @param [password]
	 * @return boolean
	 */
	public static boolean passwordStrongOne(String password){
		if(StringUtils.isEmpty(password)){
			return false;
		}
		String regex = "^(?=.*[A-Za-z])(?=.*\\d)(?=.*[$@$!%*#?&])[A-Za-z\\d$@$!%*#?&]{8,30}$";
		//System.out.println(regex);
		return password.matches(regex);
	}


	/*        *
	 *至少8-30个字符，至少1个大写字母，1个小写字母和1个数字
	 * @author 409390047@qq.com
	 * @date 2019/8/15
	 * @param [password]
	 * @return boolean
	 */
	public static boolean passwordStrongTwo(String password){
		if(StringUtils.isEmpty(password)){
			return false;
		}
		String regex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[a-zA-Z\\d]{8,30}$";
		return password.matches(regex);
	}

	/*        *
	 *最少8-30字符，至少1个大写字母，1个小写字母，1个数字和1个特殊字符
	 * @author 409390047@qq.com
	 * @date 2019/8/15
	 * @param [password]
	 * @return boolean
	 */
	public static boolean passwordStrongThree(String password){
		if(StringUtils.isEmpty(password)){
			return false;
		}
		String regex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[$@$!%*?&])[A-Za-z\\d$@$!%*?&]{8,30}$";
		return password.matches(regex);
	}



	/**
	 * 验证手机号码
	 * 	 * 移动号码段:139、138、137、136、135、134、150、151、152、157、158、159、182、183、187、188、147
	 * 	 * 联通号码段:130、131、132、136、185、186、145
	 * 	 * 电信号码段:133、153、180、189
	 * @param phoneNum 手机号码
	 * @return 通过=true, 不通过=false
	 */
	public static boolean validatePhoneNum(String phoneNum){
		boolean flag = false;
		if(StringUtils.isEmpty(phoneNum)){
			return flag;
		}
		String regex = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,1-9]))\\d{8}$";
		flag = phoneNum.matches(regex);
		return flag;
	}

	public final static Pattern p = Pattern.compile("\\((.*)\\)");

	/**
	 * 移除号码中的括号注释
	 * @return
	 */
	public static String removePhoneNumMemo(String phoneSrc){
		String str = null;
		if(StringUtils.isEmpty(phoneSrc)){
			return str;
		}

		 Matcher m = p.matcher(phoneSrc);
		return m.replaceAll("");
	}
	

	/**
	* @Title: isEmail 
	* @Description: TODO(校验邮件地址) 
	* @param @param email
	* @param @return    设定文件 
	* @return boolean    返回类型 
	* @throws
	 */
	 public static boolean isEmail(String email){
		 if(StringUtils.isEmpty(email)){
			 return false;
		 }
		//正则表达式
		String regex = "^(\\w)+(\\.\\w+)*@(\\w)+((\\.\\w+)+)$";
		return email.matches(regex);
	 }
	
	 
	 
	 
	 /** 
	     * 将通配符表达式转化为正则表达式 
					    1:* 表示匹配0或多个不是/的字符
						2:** 表示匹配0或多个任意字符
						3:? 表示匹配1个任意字符
	     * @param path 
	     * @return 
	     */  
	    private static String getRegPath(String path) {  
	        char[] chars = path.toCharArray();  
	        int len = chars.length;  
	        StringBuilder sb = new StringBuilder();  
	        boolean preX = false;  
	        for(int i=0;i<len;i++){  
	            if (chars[i] == '*'){//遇到*字符  
	                if (preX){//如果是第二次遇到*，则将**替换成.*  
	                    sb.append(".*");  
	                    preX = false;  
	                }else if(i+1 == len){//如果是遇到单星，且单星是最后一个字符，则直接将*转成[^/]*  
	                    sb.append("[^/]*");  
	                }else{//否则单星后面还有字符，则不做任何动作，下一把再做动作  
	                    preX = true;  
	                    continue;  
	                }  
	            }else{//遇到非*字符  
	                if (preX){//如果上一把是*，则先把上一把的*对应的[^/]*添进来  
	                    sb.append("[^/]*");  
	                    preX = false;  
	                }  
	                if (chars[i] == '?'){//接着判断当前字符是不是?，是的话替换成.  
	                    sb.append('.');  
	                }else{//不是?的话，则就是普通字符，直接添进来  
	                    sb.append(chars[i]);  
	                }  
	            }  
	        }  
	        return sb.toString();  
	    }  

	    /** 
	     * 通配符模式 
	     * @param whitePath - 白名单地址 
	     * @param reqPath - 请求地址 
	     * @return 
	     */  
	    public static boolean wildcardEquals(String whitePath, String reqPath) {  
	        String regPath = getRegPath(whitePath);  
	        return Pattern.compile(regPath).matcher(reqPath).matches();  
	    }
	    public static boolean checkWhiteList(String reqPath,String[] whiteList){
	    	boolean f =false;
	    	if(StringUtils.isEmpty(reqPath) || whiteList==null){
	    		return f;
	    	}
	    	for(String whitePath : whiteList){
	    		f = wildcardEquals(whitePath,reqPath);
	    		if(f){
	    			break;
	    		}
	    	}
	    	return f;
	    }
	    
	    
	 
	 
	 
	 
	 
	 
	 
}
